package com.qf.thread;

import org.omg.CORBA.INTERNAL;

import javax.security.auth.callback.Callback;
import java.util.concurrent.*;

public class Demo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

//        new MyThread().start();
//        new MyThread().start();
//
//        new Thread(new MyRunnable()).start();
//        new Thread(new MyRunnable()).start();

        // 启动一个线程帮我计算10*20，最后返回结果结果


//        // 1.创建一个任务类
//        MyCallable myCallable = new MyCallable(10, 20);
//
//        // 2.创建有返回值的taks
//        FutureTask task = new FutureTask(myCallable);
//
//        // 3.启动线程
//        new Thread(task).start();
//
//        // 4.获取结果
//        Object o = task.get(); // get方法会阻塞，知道task返回结果
//        System.out.println(o);


        // 使用一个固定参数的额线程池
//        ExecutorService executorService = Executors.newFixedThreadPool(10);
//        executorService.submit(()->{
//            System.out.println("ExecutorService:"+Thread.currentThread().getName());
//        });




        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                5, // 核心线程的数量(初始化的数量)
                10, // 线程池能容纳最大线程数量
                2, // 时间
                TimeUnit.MINUTES, // 时间单位
                new LinkedBlockingQueue<>(100000),// , // 队列
                Executors.defaultThreadFactory(), // 创建线程的工厂
                new ThreadPoolExecutor.AbortPolicy()); // 拒绝策略


        executor.submit(()->{
            System.out.println("Demo.main");
        });

    }
}

/**
 * 演示继承Thread类
 */
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("MyThread:" + Thread.currentThread().getName());

    }
}

/**
 * 演示实现Runnable
 */
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("MyRunnable:" + Thread.currentThread().getName());
    }
}

class MyCallable implements Callable<Integer> {

    private Integer a;
    private Integer b;

    public MyCallable(Integer a, Integer b) {
        this.a = a;
        this.b = b;
    }

    // 此时的方法是有返回值
    @Override
    public Integer call() throws Exception {

        // 1.计算结果
        int result = a + b;

        System.out.println("计算完了正在休息。。。；");
        Thread.sleep(2000);

        // 2.返回结果
        return result;
    }
}